from django.contrib.auth.models import User
from django.db import models


# Create your models here.
# 继承models.Model成为   模型类
# 创建完模型类之后都需要迁移映射
class Classes(models.Model):
    # 设置自增长约束 主键约束 它能唯一标识表中的每一条记录，是数据库表结构设计的核心要素之一。
    # id = models.AutoField(primary_key=True) #AutoField 自增长  id 字段
    # primary_key（主键）是用于唯一标识表中每条记录的一列或一组列。
    name = models.CharField(max_length=30, unique=True, )  # 姓名字段 字符串类型CharField 限制最长字段为30

    # 默认都有非空约束 设置可以为空null= True

    #     重写 输出魔法
    def __str__(self):  # __init__(self, ...)：对象初始化方法，
        # 创建实例时自动调用，魔法方法（Magic Methods）是一类以双下划线 __ 开头和结尾的特殊方法，
        # 用于实现对象的特定行为（如运算、比较、转换等）。它们通常不需要直接调用，
        # 而是在特定场景下由 Python 解释器自动触发。
        return  self.name  # 拼接
    # 'Classes<name=%s>' %

    #    创建标签模型


class Label(models.Model):  # label 用于定义字段的显示名称：
    name = models.CharField(max_length=10)

    # 重写输出魔法
    def __str__(self):
        return self.name
        # 'label<name:%s>'%


# 创建用户详情表
class UserDetail(models.Model):
    # blank=Ture 前端传的值 可以为空 null = True 数据表里面的值可以为空
    age = models.IntegerField(null=True, blank=True)
    sex = models.BooleanField(null=True, blank=True)
    # 关联用户表 指定user表的数据被删除时，用户详情表的数据被一起删除
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    # 创建文章表


class Article(models.Model):
    #     文章标题
    title = models.CharField(max_length=30)  # 长度  # models.CharField 是 Django 模型中最常用的字段类型之一，
    # 用于存储字符串数据。它适用于存储短文本，如名称、标题、用户名等。
    #     文章简介
    desc = models.CharField(max_length=200)
    # 文章内容
    content = models.TextField()
    # 封面图  实际上保存的是图片的 路由 图片保存在服务器中
    cover = models.TextField()
    # 创建时间  日期时间类型
    creat_time = models.DateTimeField(auto_now_add=True)  # 不可更改
    #     更新时间
    update_time = models.DateTimeField(auto_now=True)  # 可更改

    #     建立表关系 约束
    #     跟文章分类表的 表约束 NOT_PROVIDED 当分类表删除时
    #     Classes 要关联的表
    classes = models.ForeignKey(Classes, on_delete=models.NOT_PROVIDED,)  #related_name='a' 更改管理器名字
    #  分类表拥有管理器

    # 跟用户表的 表约束
    user = models.ForeignKey(User,on_delete=models.CASCADE)  # on_delete=models.CASCADE 用于指定当被关联的主表记录被删除时，从表中关联的记录应如何处理。
    # CASCADE 表示 “级联删除”—— 当主表中的一条记录被删除时，从表中所有与该记录关联的记录会自动被删除。
    # 多对多表关系建立 建立删除行为 因为都多会产生关系表
    # 关系表会自动创建
    label = models.ManyToManyField(Label)

    def __str__(self):
        return 'Article<title:%s>' % self.title
